﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using CuadroMandoIntegralFMCH.Ds;
using DAL.DTOs;
using DAL.Modelos;
using DevExpress.Utils;
using DevExpress.XtraCharts;
using DevExpress.XtraCharts.Wizard;

namespace CuadroMandoIntegralFMCH.Form_s.Debitos
{
    public partial class DebitosEstadisticas : Form
    {
        public DebitosEstadisticas()
        {
            InitializeComponent();
        }

        private void DebitosEstadisticas_Load(object sender, EventArgs e)
        {
            
            
            //Cuadro 1------
            var totalFacturado = new Modelo().GetTotalPorPeriodoPorDefecto();
            var totalDebitos = Procesar(totalFacturado.idPeriodo);
            var mes = new Modelo().GetPeriodo(totalFacturado.idPeriodo)[0];
            var anio = new Modelo().GetPeriodo(totalFacturado.idPeriodo)[1];
            dateTimePicker1.Value = DateTime.Parse("01"+"/" + mes.ToString() + "/" + anio.ToString());
            totalDebitos = totalDebitos * -1;
            var facturado = totalFacturado.TotalPeriodo - totalDebitos;

            var porcentajeDebitos = (totalDebitos * 100) / totalFacturado.TotalPeriodo;
            var porcentajeFacturado = (facturado * 100) / totalFacturado.TotalPeriodo;
            var debitos = new EstadisticasFacturadoPorDebito();
            var totalF = new EstadisticasFacturadoPorDebito();
            var listaEstadistica = new EstadisticaDebitosPorTotalFacturado();

            debitos.Nombre = "Debitos";
            debitos.Porcentaje = porcentajeDebitos;
            
            totalF.Nombre = "Facturado";
            totalF.Porcentaje = porcentajeFacturado;
            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        debitos.Nombre,
                                                        debitos.Porcentaje
                                                    });

            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        totalF.Nombre,
                                                        totalF.Porcentaje
                                                    });

            estadisticaDebitosPorTotalFacturadoBindingSource.DataSource = listaEstadistica;

            //Fin Cuadro 1----------------------------------

            //Cuadro 2
            estadisticaAmbulatorioVsInternadosBindingSource.DataSource = Procesar2(totalFacturado.idPeriodo);

            
            //Fin Cuadro 2

            //Cuadro 3
            estadisticaConsultaVsPracticaBindingSource.DataSource = Procesar3(totalFacturado.idPeriodo, totalDebitos);
            //Fin Cuadro 3

            //Cuadro 4
            var motivo = new EstadisticaMotivoDebito();
            List<Estadistica> estadistica = new Modelo().ListaTotalesPorMotivoDebito(totalFacturado.idPeriodo);

            foreach (var estadistica1 in estadistica)
            {
                var total = ((estadistica1.Porcentaje*-1)*100)/totalDebitos;
                motivo.Tables[0].Rows.Add(new object[]
                                                    {
                                                        estadistica1.nombre,
                                                        total
                                                    });
            }

            estadisticaMotivoDebitoBindingSource1.DataSource = motivo;
                ;
            //Fin Cuadro 4
        }

        //Para el gráfico 1
        private decimal Procesar(int idPeriodo)
        {
            var dsGeneral = new DsDebitosGeneral();

            //Consulto el ID del Periodo que deseamos consultar los Débitos.
            //var idPeriodo = new Modelo().VerificacionPeriodoId(dateTimePicker1.Value.Month, dateTimePicker1.Value.Year);

            //Tomar Lista de debitos de acuerdo al período que haya seleccionado
            //var debitos = new Modelo().DebitosPeriodo(idPeriodo);

            var totales = new Modelo().ListaTotales(idPeriodo);
            if (totales.Count != 0)
            {
                var tot = new SortableBindingList<PrestadoresTotales>(totales);

                decimal importe = 0;
                foreach (var prestadoresTotalese in tot)
                {
                    importe = importe + prestadoresTotalese.Importe;
                }

                return importe;
            }
            else
            {
                MessageBox.Show(
                    @"No se ha procesado la totalización o bien no se importaron los débitos del mes de " +
                    dateTimePicker1.Value.Month.ToString(), "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return 0;
            }

        }


        //Cuadro 2
        private EstadisticaAmbulatorioVsInternados Procesar2(int idPeriodo)
        {
            var listaEstadistica = new EstadisticaAmbulatorioVsInternados();

            var totalesA = new Modelo().ListaTotalesAmbulatorio(idPeriodo);
            var totalesI = new Modelo().ListaTotalesInternado(idPeriodo);

            var totalA = ((totalesA*100)/(totalesA + totalesI))*-1;
            var totalI = ((totalesI * 100) / (totalesA + totalesI)) * -1;


            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        "Ambulatorio",
                                                        totalA
                                                    });

            

            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        "Internado",
                                                        totalI
                                                    });

            return listaEstadistica;

        }

        private EstadisticaConsultaVsPractica Procesar3(int idPeriodo, decimal totalDebitos)
        {
            var totalConsulta = new Modelo().ListaTotalesConsulta(idPeriodo)*-1;
            var totalPractica = totalDebitos - totalConsulta;

            var totalC = ((totalConsulta*100)/totalDebitos);
            var totalP = ((totalPractica*100)/totalDebitos);

            var listaEstadistica = new EstadisticaConsultaVsPractica();

            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        "Consultas",
                                                        totalC
                                                    });



            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        "Practicas",
                                                        totalP
                                                    });

            return listaEstadistica;
        }

        private void btCambiar_Click(object sender, EventArgs e)
        {
            var idPeriodo = new Modelo().VerificacionPeriodoId(dateTimePicker1.Value.Month, dateTimePicker1.Value.Year);
            //Cuadro 1------
            var totalFacturado = new Modelo().GetTotalPorPeriodoPorDefecto();
            var totalDebitos = Procesar(totalFacturado.idPeriodo);
            var mes = new Modelo().GetPeriodo(idPeriodo)[0];
            var anio = new Modelo().GetPeriodo(idPeriodo)[1];
            dateTimePicker1.Value = DateTime.Parse("01" + "/" + mes.ToString() + "/" + anio.ToString());
            totalDebitos = totalDebitos * -1;
            var facturado = totalFacturado.TotalPeriodo - totalDebitos;

            var porcentajeDebitos = (totalDebitos * 100) / totalFacturado.TotalPeriodo;
            var porcentajeFacturado = (facturado * 100) / totalFacturado.TotalPeriodo;
            var debitos = new EstadisticasFacturadoPorDebito();
            var totalF = new EstadisticasFacturadoPorDebito();
            var listaEstadistica = new EstadisticaDebitosPorTotalFacturado();

            debitos.Nombre = "Debitos";
            debitos.Porcentaje = porcentajeDebitos;

            totalF.Nombre = "Percibido";
            totalF.Porcentaje = porcentajeFacturado;
            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        debitos.Nombre,
                                                        debitos.Porcentaje
                                                    });

            listaEstadistica.Tables[0].Rows.Add(new object[]
                                                    {
                                                        totalF.Nombre,
                                                        totalF.Porcentaje
                                                    });

            estadisticaDebitosPorTotalFacturadoBindingSource.DataSource = listaEstadistica;
            //Fin Cuadro 1----------------------------------

            //Cuadro 2
            estadisticaAmbulatorioVsInternadosBindingSource.DataSource = Procesar2(idPeriodo);


            //Fin Cuadro 2

            //Cuadro 3
            estadisticaConsultaVsPracticaBindingSource.DataSource = Procesar3(idPeriodo, totalDebitos);
            //Fin Cuadro 3

            //Cuadro 4
            var motivo = new EstadisticaMotivoDebito();
            List<Estadistica> estadistica = new Modelo().ListaTotalesPorMotivoDebito(idPeriodo);

            foreach (var estadistica1 in estadistica)
            {
                var total = ((estadistica1.Porcentaje * -1) * 100) / totalDebitos;
                motivo.Tables[0].Rows.Add(new object[]
                                                    {
                                                        estadistica1.nombre,
                                                        total
                                                    });
            }

            estadisticaMotivoDebitoBindingSource1.DataSource = motivo;
            ;
            //Fin Cuadro 4
        }

        private void exportarPDF_Click(object sender, EventArgs e)
        {
            FolderBrowserDialog brwsr = new FolderBrowserDialog();

            //Check to see if the user clicked the cancel button
            if (brwsr.ShowDialog() == DialogResult.Cancel)
                return;
            chartControl1.ExportToPdf(brwsr.SelectedPath + @"\DebitiadoVsPercibido.pdf");
            chartControl2.ExportToPdf(brwsr.SelectedPath + @"\AmbulatorioVsInternado.pdf");
            chartControl3.ExportToPdf(brwsr.SelectedPath + @"\ConsultasVsPracticas.pdf");
            chartControl4.ExportToPdf(brwsr.SelectedPath + @"\DebitosPorMotivos.pdf");
        }
    }



    public class EstadisticasFacturadoPorDebito
    {
        public string Nombre { get; set; }
        public decimal Porcentaje { get; set; }
    }
}
